﻿// Telephone Lines POJ - 3662.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>

using namespace std;
//https://vjudge.csgrandeur.cn/problem/POJ-3662

/*
农场主约翰想在自己的农场安装一条电话线。
不幸的是，电话公司并不合作，因此他需要支付一些电缆费用，以便将他的农场与电话系统连接起来。

农场主约翰的农场周围散布着 N 根（1 ≤ N ≤ 1,000）废弃的电线杆，编号为 1...N，这些电线杆没有电缆连接。
总共有 P（1 ≤ P ≤ 10,000）对电线杆可以用电缆连接，其余的相距太远。

第 i 根电缆可以连接两个不同的极点 Ai 和 Bi，如果使用，长度为 Li（1 ≤ Li ≤ 1,000,000）个单位。
输入数据集不会重复命名任何 {Ai, Bi} 对。电线杆 1 已连接到电话系统，电线杆 N 位于农场。
1 号线杆和 N 号线杆需要通过电缆路径连接，其余线杆可能使用，也可能不使用。

事实证明，电话公司愿意免费为农场主约翰提供 K（0 ≤ K < N）长的电缆。
除此之外，他需要支付的价格等于他所需的剩余最长电缆的长度（每对电线杆用单独的电缆连接），如果他不需要任何额外的电缆，则价格为 0。

求农民约翰必须支付的最低金额。

输入
* 第 1 行 三个空格分隔的整数： N、P 和 K
* 第 2...P+1 行： 第 i+1 行包含三个空格分隔的整数： Ai、Bi 和 Li

输出
* 第 1 行： 一个整数，即农场主约翰可以支付的最低金额。如果农场无法连接到电话公司，则打印-1。
*/



#include <iostream>
#include <deque>
#include <cstring>
#include <algorithm>


using namespace std;


const int N = 1010;
const int M = 20010;

int n, m, k;
int h[N], e[M], w[M], ne[M], idx;
deque<int> q;
int dist[N];
bool st[N];

void add(int a, int b, int c) {
	e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}

bool check(int bound) {
	memset(st, 0, sizeof st);
	memset(dist, 0x3f, sizeof dist);
	dist[1] = 0;
	q.push_back(1);

	while (q.size()) {
		int t = q.front(); q.pop_front();
		if (st[t]) continue;
		st[t] = true;

		for (int i = h[t]; ~i; i = ne[i]) {
			int j = e[i]; int v = w[i] > bound;
			if (dist[j] > dist[t] + v) {
				dist[j] = dist[t] + v;
				if (!v) q.push_front(j);
				else q.push_back(j);
			}
		}
	}


	return dist[n] <= k;
}

int main()
{
	cin >> n >> m >> k;
	memset(h, -1, sizeof h);

	while (m--) {
		int a, b, c;
		cin >> a >> b >> c;
		add(a, b, c); add(b, a, c);
	}

	int l = 0; int r = 1e6 + 1;
	while (l < r) {
		int mid = l + r >> 1;
		if (check(mid)) r = mid;
		else l = mid + 1;
	}

	if (r == 1e6 + 1) r = -1;
	cout << r << endl;

	return 0;
}

